home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / progtool / modula2 / module / preislis.mod < prev    next >
Text File  |  1995-11-25  |  5KB  |  211 lines

  1. IMPLEMENTATION MODULE  PreisListe;
  2.  
  3. FROM SYSTEM IMPORT TSIZE;
  4. FROM Storage IMPORT ALLOCATE,DEALLOCATE;
  5.  
  6. TYPE PriceList               = POINTER TO PriceListHeader;
  7.      PriceListElementPointer = POINTER TO PriceListElement;
  8.      PriceListHeader         = RECORD
  9.                              current,
  10.                              first,last : PriceListElementPointer;
  11.                           END ;
  12.      PriceListElement        = RECORD
  13.                              next,prev     : PriceListElementPointer;
  14.                              value         : EKPreis
  15.                           END(*RECORD*);
  16.  
  17. PROCEDURE MakePriceList(VAR L:PriceList);
  18. BEGIN
  19.    ALLOCATE(L,TSIZE(PriceListHeader));
  20.    L^.first:=NIL;
  21.    L^.last:=NIL;
  22.    L^.current:=NIL;
  23. END MakePriceList;
  24.  
  25. PROCEDURE KillPriceList(VAR L:PriceList);
  26. VAR p,q:PriceListElementPointer;
  27. BEGIN
  28.     p:=L^.first;
  29.     WHILE (p#NIL) DO
  30.       q:=p;
  31.       p:=p^.next;
  32.       DEALLOCATE(q);
  33.     END(*WHILE*);
  34.     DEALLOCATE(L);
  35.     L:=NIL
  36. END KillPriceList;
  37.  
  38. PROCEDURE First(VAR L:PriceList);
  39. BEGIN
  40.     L^.current:=L^.first;
  41. END First;
  42.  
  43. PROCEDURE Last(VAR L:PriceList);
  44. BEGIN
  45.     L^.current:=L^.last;
  46. END Last;
  47.  
  48. PROCEDURE Next(VAR L:PriceList);
  49. BEGIN
  50.    IF (~Empty(L) AND (L^.current^.next # NIL))THEN
  51.       L^.current:=L^.current^.next;
  52.    END(*IF*);
  53. END Next;
  54.  
  55. PROCEDURE Prev(VAR L:PriceList);
  56. BEGIN
  57.    IF (~Empty(L) AND (L^.current^.prev # NIL))THEN
  58.       L^.current:=L^.current^.prev;
  59.    END(*IF*);
  60. END Prev;
  61.  
  62. PROCEDURE Empty(VAR L:PriceList):BOOLEAN;
  63. BEGIN
  64.    RETURN L^.first=NIL
  65. END Empty;
  66.  
  67. PROCEDURE AtFirst(VAR L:PriceList):BOOLEAN;
  68. BEGIN
  69.    RETURN L^.current=L^.first
  70. END AtFirst;
  71.  
  72. PROCEDURE AtLast(VAR L:PriceList):BOOLEAN;
  73. BEGIN
  74.    RETURN L^.current=L^.last
  75. END AtLast;
  76.  
  77. PROCEDURE Find(VAR L:PriceList;VAR Value:EKPreis; VAR Finde:FindProc; Key:EKPreis ):BOOLEAN;
  78. VAR OK :BOOLEAN;
  79. BEGIN
  80.     IF ~Empty(L) THEN
  81.        LOOP
  82.           OK:=GetValue(L,Value);
  83.           IF Finde(Value,Key) THEN
  84.              RETURN TRUE
  85.           ELSE
  86.               IF AtLast(L) THEN
  87.                     RETURN FALSE
  88.               END(*IF*);
  89.               Next(L);
  90.           END(*IF*);
  91.        END(*LOOP*);
  92.     ELSE
  93.        RETURN FALSE
  94.     END(*IF*);
  95. END Find;
  96.  
  97. PROCEDURE FindFirst(VAR L:PriceList;VAR Value:EKPreis; VAR Finde:FindProc; Key:EKPreis):BOOLEAN;
  98. BEGIN
  99.    IF ~Empty(L) THEN
  100.       First(L);
  101.       RETURN Find(L,Value,Finde,Key);
  102.    ELSE
  103.       RETURN FALSE
  104.    END(*IF*);
  105. END FindFirst;
  106.  
  107. PROCEDURE FindNext(VAR L:PriceList;VAR Value:EKPreis; VAR Finde:FindProc;Key:EKPreis):BOOLEAN;
  108. BEGIN
  109.    IF ~Empty(L) THEN
  110.       Next(L);
  111.       RETURN Find(L,Value,Finde,Key);
  112.    ELSE
  113.       RETURN FALSE
  114.    END(*IF*);
  115. END FindNext;
  116.  
  117.  
  118. PROCEDURE GetValue(VAR L:PriceList;VAR Value :EKPreis):BOOLEAN;
  119. VAR i:INTEGER;
  120. BEGIN
  121.    IF ~Empty(L) THEN
  122.          Value:=L^.current^.value;
  123.      RETURN TRUE
  124.    ELSE
  125.      RETURN FALSE
  126.    END(*IF*);
  127. END GetValue;
  128.  
  129. PROCEDURE SetValue(VAR L:PriceList;Value :EKPreis);
  130. VAR  i:INTEGER;
  131. BEGIN
  132.    IF ~Empty(L) THEN
  133.          L^.current^.value:=Value;
  134.    END(*IF*);
  135. END SetValue;
  136.  
  137. PROCEDURE EnterElement(VAR L:PriceList);
  138. VAR p,q :PriceListElementPointer;
  139. BEGIN
  140.    ALLOCATE(p,TSIZE(PriceListElement));
  141.    IF Empty(L) THEN
  142.          L^.first:=p;
  143.          L^.last:=p;
  144.          p^.next:=NIL;
  145.          p^.prev:=NIL;
  146.    ELSIF AtFirst(L) THEN
  147.          p^.next:=L^.first;
  148.          L^.first:=p;
  149.          p^.prev:=NIL;
  150.          L^.current^.prev:=p;
  151.    ELSE
  152.          p^.next:=L^.current;
  153.          p^.prev:=L^.current^.prev;
  154.          q:=L^.current^.prev;
  155.          q^.next:=p;
  156.          L^.current^.prev:=p;
  157.   END(*IF*);
  158.   L^.current:=p;
  159. END EnterElement;
  160.  
  161. PROCEDURE AppendElement(VAR L:PriceList);
  162. VAR p,q :PriceListElementPointer;
  163. BEGIN
  164.    ALLOCATE(p,TSIZE(PriceListElement));
  165.    IF Empty(L) THEN
  166.          L^.first:=p;
  167.          L^.last:=p;
  168.          p^.next:=NIL;
  169.          p^.prev:=NIL;
  170.    ELSIF AtLast(L) THEN
  171.          p^.prev:=L^.last;
  172.          L^.last:=p;
  173.          p^.next:=NIL;
  174.          L^.current^.next:=p;
  175.    ELSE
  176.          p^.next:=L^.current^.next;
  177.          p^.prev:=L^.current;
  178.          q:=L^.current^.next;
  179.          q^.prev:=p;
  180.          L^.current^.next:=p;
  181.   END(*IF*);
  182.   L^.current:=p;
  183. END AppendElement;
  184.  
  185. PROCEDURE RemoveElement(VAR L:PriceList);
  186. VAR p,q :PriceListElementPointer;
  187. BEGIN
  188.    IF ~Empty(L) THEN
  189.    p:=L^.current;
  190.    IF (AtFirst(L) AND AtLast(L)) THEN
  191.        L^.first:=NIL;
  192.        L^.last:=NIL;
  193.        L^.current:=NIL;
  194.    ELSIF AtFirst(L) THEN
  195.        L^.first:=L^.current^.next;
  196.        L^.first^.prev:=NIL;
  197.        L^.current:=L^.current^.next;
  198.    ELSIF AtLast(L) THEN
  199.        L^.last:=L^.current^.prev;
  200.        L^.last^.next:=NIL;
  201.        L^.current:=L^.current^.prev;
  202.    ELSE
  203.        p^.prev^.next:=p^.next;
  204.        p^.next^.prev:=p^.prev;
  205.        L^.current:=L^.current^.next;
  206.    END(*IF*);
  207.    DEALLOCATE(p);
  208.    END(*IF*);
  209. END RemoveElement;
  210. END PreisListe.
  211.